package com.课上案例练习.线程.等待唤醒机制.线程等待.两个线程通信;


/**
 * public final void wait()：让当前线程进入等待状态(并不是当前线程对象来调用,而是当前锁对象来调用)
 * 调用wait()之后释放当前锁,并且让当前锁对象中对应的线程阻塞.
 * public final void notify()：随机唤醒一条此锁对象对应线程中的一条.notify()也是锁对象来调用,并不是当前线程对象调用
 */
public class Test1 {

    //    不使用通信，实现
//    实现需求：线程1执行一次"世界那么大"，线程2执行一次"我想看看"，交替执行
    public static void main(String[] args) {
        //不加锁的境况下
//        demo1();
        //加锁保证一个任务能执行完
//        demo2();
        //实现交替通信,如果不使用通信，容易尝试执行完该第一个任务又再次获取该任务
        Test1 test1 = new Test1();
        //加锁的情况下
        Show3 show1 = new Show3(1,test1);
        Show3 show2 = new Show3(0,test1);
        new Thread(show1).start();
        new Thread(show2).start();
    }

    private static void demo2() {
        Test1 test1 = new Test1();
        //加锁的情况下
        Show2 show1 = new Show2(1, test1);
        Show2 show2 = new Show2(0, test1);
        new Thread(show1).start();
        new Thread(show2).start();
    }

    private static void demo1() {
        Show1 show1 = new Show1(1);
        Show1 show2 = new Show1(0);
        new Thread(show1).start();
        new Thread(show2).start();
    }
}

